package cn.zmh.framework.util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;

/**
 * @Title: DateUtil.java
 * @Package com.gexin.platform.biz.common.utils
 * @Description: 日期辅助类
 * @author Yanjh
 * @date 2011-8-16 上午11:34:04
 * @version V1.0
 */
public class DateUtil {

	/**
	 * @Title: getDateString
	 * @Description: 使用"yyyy-MM-dd HH:mm:ss"格式化日期
	 * @author Yanjh
	 * @param date
	 * @return String 返回类型
	 */
	public static String getDateString(Date date) {
		return getDateString(date, "yyyy-MM-dd HH:mm:ss");
	}

	/**
	 * @Title: getDateString
	 * @Description: 格式化日期
	 * @author Yanjh
	 * @param date
	 *            日期
	 * @param format
	 *            模式
	 * @return String 返回类型
	 */
	public static String getDateString(Date date, String format) {
		if (date != null) {
			SimpleDateFormat formatter = new SimpleDateFormat(format);
			String dateString = formatter.format(date);
			return dateString;
		}
		return null;
	}

	/**
	 * @Title: getDateString
	 * @Description: 使用"yyyyMMddHHmmss"格式化日期
	 * @author Wujl
	 * @param date
	 * @return String 返回类型
	 */
	public static String getDateString14(Date date) {
		return getDateString(date, "yyyyMMddHHmmss");
	}

	
	/**
	 * @Title: getDateString
	 * @Description: 使用"yyyy-MM-dd HH:mm:ss"格式化日期
	 * @author Wujl
	 * @param date
	 * @return String 返回类型
	 */
	public static String getDateString19(Date date) {
		return getDateString(date, "yyyy-MM-dd HH:mm:ss");
	}
	/**
	 * @Title: getDateString
	 * @Description: 使用"yyyyMMdd"格式化日期
	 * @author Wujl
	 * @param date
	 * @return String 返回类型
	 */
	public static String getDateString8(Date date) {
		return getDateString(date, "yyyyMMdd");
	}

	/**
	 * @Title: getDateString
	 * @Description: 使用"yyyy-MM-dd"格式化日期
	 * @author HouJunChang
	 * @param date
	 * @return String 返回类型
	 */
	public static String getDateString10(Date date) {
		return getDateString(date, "yyyy-MM-dd");
	}
	
	/**
	 * @Title: getDateString
	 * @Description: 使用"yyyy-MM"格式化日期
	 * @author Wujl
	 * @param date
	 * @return String 返回类型
	 */
	public static String getDateString7(Date date) {
		return getDateString(date, "yyyy-MM");
	}

	/**
	 * 返回年份("获取年")
	 * 
	 * @param date
	 *            日期
	 * @return int 返回年份
	 */
	public static int getYear(Date date) {
		java.util.Calendar c = java.util.Calendar.getInstance();
		c.setTime(date);
		return c.get(java.util.Calendar.YEAR);
	}

	/**
	 * 返回月份("获取月")
	 * 
	 * @param date
	 *            日期
	 * @return int 返回月份
	 */
	public static int getMonth(Date date) {
		java.util.Calendar c = java.util.Calendar.getInstance();
		c.setTime(date);
		return c.get(java.util.Calendar.MONTH) + 1;
	}

	/**
	 * 返回日份("获取日")
	 * 
	 * @param date
	 *            日期
	 * @return int 返回日份
	 */
	public static int getDay(Date date) {
		java.util.Calendar c = java.util.Calendar.getInstance();
		c.setTime(date);
		return c.get(java.util.Calendar.DAY_OF_MONTH);
	}

	/**
	 * 返回小时("获取时")
	 * 
	 * @param date
	 *            日期
	 * @return int 返回小时
	 */
	public static int getHour(Date date) {
		java.util.Calendar c = java.util.Calendar.getInstance();
		c.setTime(date);
		return c.get(java.util.Calendar.HOUR_OF_DAY);
	}

	/**
	 * 返回分钟("获取分")
	 * 
	 * @param date
	 *            日期
	 * @return int 返回分钟
	 */
	public static int getMinute(Date date) {
		java.util.Calendar c = java.util.Calendar.getInstance();
		c.setTime(date);
		return c.get(java.util.Calendar.MINUTE);
	}

	/**
	 * 返回秒钟("获取秒")
	 * 
	 * @param date
	 *            日期
	 * @return int 返回秒钟
	 */
	public static int getSecond(Date date) {
		java.util.Calendar c = java.util.Calendar.getInstance();
		c.setTime(date);
		return c.get(java.util.Calendar.SECOND);
	}

	/**
	 * 返回毫秒("获取毫秒")
	 * 
	 * @param date
	 *            日期
	 * @return int 返回毫秒
	 */
	public static long getMillis(Date date) {
		java.util.Calendar c = java.util.Calendar.getInstance();
		c.setTime(date);
		return c.getTimeInMillis();
	}

	/**
	 * 日期相加("日期增加月数")
	 * 
	 * @param date
	 *            日期
	 * @param month
	 *            月数
	 * @return 返回相加后的日期
	 */
	public static Date addMonth(Date date, int month) {
		java.util.Calendar c = java.util.Calendar.getInstance();
		c.setTime(date);
		c.add(Calendar.MONTH, month);// 增加一天

		return c.getTime();
	}

	/**
	 * 日期相加
	 * 
	 * @param date
	 *            日期
	 * @param day
	 *            天数
	 * @return 返回相加后的日期
	 */
	public static Date addDate(Date date, int day) {
		java.util.Calendar c = java.util.Calendar.getInstance();
		c.setTimeInMillis(getMillis(date) + ((long) day) * 24 * 3600 * 1000);
		return c.getTime();
	}

	/**
	 * 日期相减
	 * 
	 * @param date
	 *            日期
	 * @param date1
	 *            日期
	 * @return 返回相减后的日期
	 */
	public static int diffDate(Date date, Date date1) {
		return (int) ((getMillis(date) - getMillis(date1)) / (24 * 3600 * 1000));
	}

	/**
	 * 日期相减
	 * 
	 * @param date1
	 *            日期字符串
	 * @param date2
	 *            日期字符串
	 * @param format
	 *            日期字符串的格式 如：yyyyMMdd ; yyyy-MM-dd
	 * @return 返回相减后的天数
	 * @throws ParseException
	 */
	public static int diffDate(String date1, String date2, String format)
			throws ParseException {
		if (null == format || "" == format) {
			format = "yyyy-MM-dd";
		}
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		java.util.Calendar c1 = java.util.Calendar.getInstance();
		java.util.Calendar c2 = java.util.Calendar.getInstance();

		c1.setTime(sdf.parse(date1));
		c2.setTime(sdf.parse(date2));
		return (int) ((getMillis(c1.getTime()) - getMillis(c2.getTime())) / (24 * 3600 * 1000));
	}

	/**
	 * 日期相减("日期加减年")
	 * 
	 * @param date
	 *            日期
	 * @param years
	 *            年份
	 * @return 返回相减后的日期
	 * @throws ParseException
	 */
	public static Date addYear(Date date, int years) throws ParseException {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		java.util.Calendar c = java.util.Calendar.getInstance();
		c.setTime(sdf.parse(sdf.format(date)));
		c.add(Calendar.YEAR, years);// 增加年份

		return c.getTime();
	}

	//
	/**
	 * 根据两个日期，得到两个日期之间的年月 日期字符串数组
	 * 
	 * @param d1
	 *            日期
	 * @param d2
	 *            日期
	 * @return 返回字符型日期时间数组
	 * @throws ParseException
	 */
	public static String[] getDates(Date d1, Date d2) throws ParseException {

		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

		Calendar cd = Calendar.getInstance();

		ArrayList<String> stringList = new ArrayList<String>();
		while (d1.compareTo(d2) <= 0) {
			cd.setTime(sdf.parse(sdf.format(d1)));
			String dString = sdf.format(d1);
			stringList.add(dString);
			cd.add(Calendar.MONTH, 1);// 增加一天
			d1 = cd.getTime();
		}
		String[] arr = new String[stringList.size()];
		return stringList.toArray(arr);
	}

	/**
	 * 返回日期("js的毫秒转换为日期")
	 * 
	 * @param millis
	 *            毫秒
	 * 
	 * @return 返回日期
	 */
	public static Date jsmillis2Date(long millis) {
		Date dt = new Date(millis * 1000);
		return dt;
	}

	/**
	 * 根据年月得到该月的开始和结束日期
	 * 
	 * @param ym
	 *            年月字符串，格式 yyyy-MM
	 * @return Object[] 首末两个时间
	 * @throws ParseException
	 */
	public static Object[] getDateYMMinAndMax(String ym) throws ParseException {
		Object[] objs = new Object[2];
		// Date dt = new Date(dt_ym + "-01");
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		java.util.Calendar c = java.util.Calendar.getInstance();
		java.util.Calendar c2 = java.util.Calendar.getInstance();
		c.setTime(sdf.parse(ym + "-01"));
		int end = c.getActualMaximum(Calendar.DAY_OF_MONTH);
		c2.setTime(sdf.parse(ym + "-" + end));

		objs[0] = c.getTime();
		objs[1] = c2.getTime();

		return objs;
	}

	/**
	 * 根据年得到该年的开始和结束日期
	 * 
	 * @param yy
	 *            年字符串，格式 yyyy
	 * @return Object[] 首末两个时间
	 * @throws ParseException
	 */
	public static Object[] getDateYYMinAndMax(String yy) throws ParseException {
		Object[] objs = new Object[2];
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		java.util.Calendar c = java.util.Calendar.getInstance();
		java.util.Calendar c2 = java.util.Calendar.getInstance();
		c.setTime(sdf.parse(yy + "-01-01"));
		c2.setTime(sdf.parse(yy + "-12-31"));

		objs[0] = c.getTime();
		objs[1] = c2.getTime();

		return objs;
	}

	/**
	 * 根据季度得到该季度的开始和结束日期
	 * 
	 * @param yy
	 *            年份
	 * @param quarter
	 *            季度 1-4
	 * @return
	 * @throws ParseException
	 */
	public static Object[] getDateQuarterMinAndMax(String yy, int quarter)
			throws ParseException {
		Object[] objs = new Object[2];
		int array[][] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 }, { 10, 11, 12 } };

		int start_month = array[quarter - 1][0];
		int end_month = array[quarter - 1][2];

		Object[] dtstarts = getDateYMMinAndMax(yy + "-" + start_month);
		Object[] dtends = getDateYMMinAndMax(yy + "-" + end_month);
		objs[0] = dtstarts[0];
		objs[1] = dtends[1];
		return objs;
	}

	/**
	 * 
	 * @param y
	 * @param num
	 * @return
	 * @throws ParseException
	 */
	public static Object[] getPentecostMinAndMax(Date y) throws ParseException {
		Object[] objs = new Object[2];
		int day = getDay(y);
		String dateStart = "";
		String dateEnd = "";
		String dateStr = getDateString(y, "yyyyMM");
		Object[] monObj = getDateYMMinAndMax(getDateString(y, "yyyy-MM"));
		String monEnd = getDateString((Date) monObj[1], "yyyyMMdd");
		if (day >= 1 && day <= 10) {
			dateStart = dateStr + "01";
			dateEnd = dateStr + "10";
		} else if (day >= 11 && day <= 20) {
			dateStart = dateStr + "11";
			dateEnd = dateStr + "20";
		} else {
			dateStart = dateStr + "21";
			dateEnd = monEnd;
		}
		objs[0] = dateStart;
		objs[1] = dateEnd;
		return objs;
	}

	/**
	 * 两个字符串的时间差
	 * 
	 * @param begin
	 *            起始时间
	 * @param end
	 *            结束时间
	 * @return 天数
	 * @throws ParseException
	 */
	public static int countDays(String begin, String end) throws ParseException {
		int days = 0;

		DateFormat df = new SimpleDateFormat("yyyyMMdd");
		Calendar c_b = Calendar.getInstance();
		Calendar c_e = Calendar.getInstance();

		c_b.setTime(df.parse(begin));
		c_e.setTime(df.parse(end));
		while (c_b.before(c_e)) {
			days++;
			c_b.add(Calendar.DAY_OF_YEAR, 1);
		}

		return days + 1;
	}

	/**
	 * 字符串转换为Date型
	 * 
	 * @param data
	 *            时间
	 * @param str
	 *            格式
	 * @return
	 * @throws ParseException
	 */
	public static Date getData(String data, String str) throws ParseException {
		SimpleDateFormat sdf = new SimpleDateFormat(str);
		Date date = null;
		date = sdf.parse(data);
		return date;
	}

	public static long parseTimestamp(String str, String formate)
			throws ParseException {
		Date date = getData(str, formate);
		return date.getTime();
	}

	/**
	 * 字符串加天数，返回字符串
	 * 
	 * @param time
	 *            当前时间
	 * @param day
	 *            天数
	 * @param str
	 *            日期格式
	 * @return String
	 * @throws ParseException
	 */
	public static String addDaysInString(String time, int day, String str)
			throws ParseException {
		Date d = getData(time, str);// 将字符串转换为date型
		d = addDate(d, day);// 加天数
		time = getDateString(d, str);// 将date型转换为字符串
		return time;
	}

	/**
	 * 计算当月1日到当天的天数,当年1月1日到当天的天数
	 * 
	 * @param now
	 *            当前时间
	 * @return Object[]
	 * @throws ParseException
	 */
	public static Object[] countMonthDaysAndYearDays(String now)
			throws ParseException {
		// 计算当月1日到当天的天数
		int days = 0;
		Object[] objs = new Object[10];
		String begin = now.substring(0, 6) + "01";

		DateFormat df = new SimpleDateFormat("yyyyMMdd");
		Calendar c_b = Calendar.getInstance();
		Calendar c_e = Calendar.getInstance();

		c_b.setTime(df.parse(begin));
		c_e.setTime(df.parse(now));
		while (c_b.before(c_e)) {
			days++;
			c_b.add(Calendar.DAY_OF_YEAR, 1);
		}

		objs[0] = begin;
		objs[1] = days + 1;

		// 当年1月1日到当天的天数
		days = 0;
		begin = now.substring(0, 4) + "0101";

		c_b.setTime(df.parse(begin));
		c_e.setTime(df.parse(now));
		while (c_b.before(c_e)) {
			days++;
			c_b.add(Calendar.DAY_OF_YEAR, 1);
		}

		objs[2] = begin;
		objs[3] = days + 1;
		objs[4] = now;

		return objs;
	}
	
	/**
	 * 计算两个日期相差的月数
	 * @param date1
	 * @param date2
	 * @return
	 */
	public static int getMonthSpace(String date1, String date2) {
		int result = 0;
		try {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

			Calendar c1 = Calendar.getInstance();
			Calendar c2 = Calendar.getInstance();

			c1.setTime(sdf.parse(date1));
			c2.setTime(sdf.parse(date2));
			result = c2.get(Calendar.MONDAY) - c1.get(Calendar.MONTH);
		} catch (Exception e) {}
		return result == 0 ? 1 : Math.abs(result);

	}
	
	/**
	 * 根据当前日期，减去一周的日期
	 * @param date
	 * @return
	 */
	public static String convertWeekByDate(Date date) {
		//设置时间格式
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Calendar cal = Calendar.getInstance();  
		cal.setTime(date);  
		cal.add(Calendar.DATE, -7);  
		String imptimeEnd = sdf.format(cal.getTime());  
		return imptimeEnd;  
	}
	
	/**
	 * 根据当前日期，减去月数,计算过去的某一个月
	 * @param date 当前日期
	 * @param subtractor 减去月数
	 * @return
	 */
	public static String convertLastMonth(Date date,int subtractor) {
		//设置时间格式
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
		Calendar cal = Calendar.getInstance();  
		cal.setTime(date);  
		cal.add(Calendar.MONTH, subtractor);  
		String imptimeEnd = sdf.format(cal.getTime());  
		return imptimeEnd;  
	}

}